﻿using System;
using System.Globalization;
using System.IO;
using System.Windows.Forms;
using EvaluacionExalmarEntidades;
using EvaluacionExalmarLogicaNegocio;
using GlobalesUtilitarios;
using System.Collections.Generic;
using Microsoft.Reporting.WinForms;
using Microsoft.Office.Interop.Excel;
using ApplicationExcel = Microsoft.Office.Interop.Excel.Application;

namespace appEvaluacionExalmarMant
{
    // ReSharper disable InconsistentNaming
    public partial class frmResultados : Form
    // ReSharper restore InconsistentNaming
    {
        private bool _bInicio = true;
        public frmResultados()
        {
            InitializeComponent();
        }

        private void frmResultados_Load(object sender, EventArgs e)
        {
            gvResultados.AutoGenerateColumns = false;
            CargarAreas();
            _bInicio = false;
        }

        private void CargarAreas()
        {
            cboArea.DataSource = new Area().Listar(null);
            cboArea.ValueMember = "IdArea";
            cboArea.DisplayMember = "Descripcion";
            //cboArea.SelectedIndex = -1;
        }

        private void CargarEmpleados(int nArea)
        {
            cboEmpleadoJerarquia.DataSource = new Empleado().Listar(new EmpleadoInfo(null, null, null, null, null, nArea, null, null, null));
            cboEmpleadoJerarquia.ValueMember = "IdEmpleado";
            cboEmpleadoJerarquia.DisplayMember = "NombreCompleto";
        }

        private void btnProcesar_Click(object sender, EventArgs e)
        {
            int? nArea = null;
            int? nEmpleado = null;

            if (chkArea.Checked)
            {
                if (cboArea.SelectedIndex > -1)
                    nArea = int.Parse(cboArea.SelectedValue.ToString());
            }
            if (chkEmpleado.Checked)
            {
                if (cboEmpleadoJerarquia.SelectedIndex > -1)
                    nEmpleado = int.Parse(cboEmpleadoJerarquia.SelectedValue.ToString());
            }

            var oEmpleado = new EmpleadoInfo(nEmpleado, null, null, null, null, null, nArea, null, null, null, null,
                                             null);

            var oListaResultados = new Resultado().Listar(new ResultadoInfo(nEmpleado, oEmpleado));

            if (chkPromedios.Checked)
            {
                var oListaFiltro = new List<ResultadoInfo>();
                for (int i = 0; i <= oListaResultados.Count - 1; i++)
                {
                    if (nudDesde != null)
                        if (oListaResultados[i].PromedioGeneral >= Double.Parse(nudDesde.Value.ToString(CultureInfo.InvariantCulture)))
                        {
                            oListaFiltro.Add(oListaResultados[i]);
                        }
                }
                gvResultados.DataSource = oListaFiltro;
            }
            else
            {
                gvResultados.DataSource = oListaResultados;    
            }

            
            Generales.CellFormat(gvResultados);
        }

        private void btnGenerarReportes_Click(object sender, EventArgs e)
        {
            try
            {
                var oListaResultados = (IList<ResultadoInfo>)gvResultados.DataSource;

                if (oListaResultados == null || oListaResultados.Count == 0)
                {
                    MessageBox.Show(@"No hay resultados para generar reportes. Por favor verifique.", @"Evaluación de Personal", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
                else
                {
                    var sRutaArchivo = Properties.Settings.Default.RutaReportes;
                    var sRutaAplicacion = Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath);
                    var oListaCompetencias = new Competencia().Listar(null);

                    if (!Directory.Exists(sRutaArchivo))
                    {
                        if (MessageBox.Show(
                            @"La ruta de generación de archivos configurada " + sRutaArchivo + @"no existe. ¿Desea crearla?",
                            @"Evaluación de Personal", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                        {
                            Directory.CreateDirectory(sRutaArchivo);
                        }
                        else
                        {
                            MessageBox.Show(@"No se generaron los reportes de las evaluaciones", @"Evaluación de Personal", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                            return;
                        }
                    }

                    foreach (var oResultado in oListaResultados)
                    {
                        IList<ResultadoInfo> oReporte = new List<ResultadoInfo>();
                        oReporte.Add(oResultado);
                        var oEmpleado = new Empleado().Listar(oResultado.Empleado);
                        var oResultadoCompetCompor =
                            new ResultadoCompetCompor().Listar(new ResultadoCompetComporInfo(oResultado.IdEmpleado, null, null, null, null, null));
                        var oResultadoCompetJerarquia =
                            new ResultadoCompetJerar().Listar(new ResultadoCompetJerarInfo(oResultado.IdEmpleado, null, null,
                                                                                           null, null, null, null, null));
                        var oResultadoComentarios =
                            new ResultadoComentarios().Listar(new ResultadoComentariosInfo(oResultado.IdEmpleado));

                        var parametros = new ReportParameter[1];
                        parametros[0] = new ReportParameter("Empleado", oResultado.Empleado.NombreCompleto);

                        var mReporte = new ReportViewer();
                        mReporte.LocalReport.ReportPath = sRutaAplicacion + "\\rptResultados.rdlc";
                        mReporte.LocalReport.DataSources.Add(new ReportDataSource("EvaluacionExalmarEntidades_ResultadoInfo", oReporte));
                        mReporte.LocalReport.DataSources.Add(new ReportDataSource("EvaluacionExalmarEntidades_CompetenciaInfo", oListaCompetencias));
                        mReporte.LocalReport.DataSources.Add(new ReportDataSource("EvaluacionExalmarEntidades_EmpleadoInfo", oEmpleado));
                        mReporte.LocalReport.DataSources.Add(new ReportDataSource("EvaluacionExalmarEntidades_ResultadoCompetComporInfo", oResultadoCompetCompor));
                        mReporte.LocalReport.DataSources.Add(new ReportDataSource("EvaluacionExalmarEntidades_ResultadoCompetJerarInfo", oResultadoCompetJerarquia));
                        mReporte.LocalReport.DataSources.Add(new ReportDataSource("EvaluacionExalmarEntidades_ResultadoComentariosInfo", oResultadoComentarios));
                        mReporte.LocalReport.SetParameters(parametros);

                        Warning[] warnings;
                        string[] streamids;
                        string mimeType;
                        string encoding;
                        string filenameExtension;

                        byte[] bytes = mReporte.LocalReport.Render("PDF", null, out mimeType, out encoding, out filenameExtension,
                                                                   out streamids, out warnings);
                        using (var fs = new FileStream(sRutaArchivo + oResultado.IdEmpleado + @" - " + oResultado.Empleado.NombreCompleto + ".pdf", FileMode.Create))
                        {
                            fs.Write(bytes, 0, bytes.Length);
                        }
                    }

                    MessageBox.Show(@"Se generaron los reportes de las evaluaciones en la ruta: " + sRutaArchivo, @"Evaluación de Personal", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, @"Evaluación de Personal", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }


        }

        private void cboArea_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboArea.SelectedIndex > -1 && !_bInicio)
            {
                int nArea = int.Parse(cboArea.SelectedValue.ToString());
                CargarEmpleados(nArea);
            }
        }

        private void chkArea_CheckedChanged(object sender, EventArgs e)
        {
            cboArea.Enabled = chkArea.Checked;
            chkEmpleado.Enabled = chkArea.Checked;
            cboEmpleadoJerarquia.Enabled = chkArea.Checked;
            if (!chkArea.Checked)
                chkEmpleado.Checked = chkArea.Checked;
        }

        private void chkEmpleado_CheckedChanged(object sender, EventArgs e)
        {
            cboEmpleadoJerarquia.Enabled = chkEmpleado.Checked;
        }

        private void chkPromedios_CheckedChanged(object sender, EventArgs e)
        {
            nudDesde.Enabled = chkPromedios.Checked;
        }

        private void btnExcel_Click(object sender, EventArgs e)
        {
            ExportarExcel();
        }

        private void ExportarExcel()
        {
            //Crear Aplicación Excel
            _Application app = new ApplicationExcel();
            //Crear Workbook de Excel
            _Workbook workbook = app.Workbooks.Add(Type.Missing);
            //Crear Worksheet
            var worksheet = (_Worksheet)workbook.ActiveSheet;
            worksheet.Name = "Evaluación Exalmar";

            for (int i = 1; i < gvResultados.Columns.Count + 1; i++)
            {
                worksheet.Cells[1, i] = gvResultados.Columns[i - 1].HeaderText;
            }

            worksheet.get_Range("A:D", "A:D").NumberFormat = "@";

            for (int i = 0; i < gvResultados.Rows.Count; i++)
            {
                for (int j = 0; j < gvResultados.Columns.Count; j++)
                {

                    worksheet.Cells[i + 2, j + 1] = gvResultados.Rows[i].Cells[j].Value.ToString();
                }
            }

            app.Visible = true;
        }
    }
}
